package com.yy.invoice.controller;

import com.yy.invoice.entity.Result;
import com.yy.invoice.entity.User;
import com.yy.invoice.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@RestController
@Slf4j
@RequestMapping("/user")
@Api(tags = "用户管理")
public class UserController {

    @Autowired
    private UserService userService;
    /**
     * 将用户名的id存在redis中，返回token
     * 用户访问其他页面时，传入token之后，后端解析出id，从redis中判断是否存在，如果存在即登录成功
     * 在访问其他页面时，token是放在header中的
     * @param user
     * @return
     */
    @ApiOperation("登录返回token")
    @PostMapping("/login")
    public Result login(User user){
        return userService.login(user);
    }

    @ApiOperation("注册")
    @PostMapping("/register")
    public Result register(@ApiParam(value = "用户信息",required = true) @RequestBody User user){
        return userService.register(user);
    }

    @ApiOperation("退出登录")
    @GetMapping("/out")
    public Result loginOut(){
        return userService.loginOut();
    }
    @ApiOperation("从redis获取用户信息")
    @GetMapping("/get")
    public Result get(HttpServletRequest request){
        return userService.get(request);
    }

    @ApiOperation("判断当前登录用户是否有效")
    @GetMapping("/check")
    public Result check(){
        return null;
    }

    /**
     * 开放不需要进行token校验的接口都需要在SpringSecurity中将权限打开才能进行访问
     * @param username
     * @return
     */
    @ApiOperation("查询用户是否存在")
    @GetMapping("/checkUsername")
    public Result check(@RequestParam("username") String username){
        return userService.checkUsername(username);
    }

    @ApiOperation("更新用户信息")
    @PostMapping("/updateUser")
    public Result updateUser(@ApiParam("用户信息") @RequestBody User user,HttpServletRequest request){
        return userService.updateUser(user,request);
    }

    /**
     * 通过用户名和邮箱重置密码
     * @param user
     * @return
     */
    @ApiOperation("重置密码")
    @PostMapping("/reset")
    public Result reset(@ApiParam("用户信息(用户名和邮箱)") @RequestBody User user){
        return userService.reset(user);
    }
}
